home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / Float.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  2KB  |  96 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  Float.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/basic.h>
  16. #include <LEDA/Int.h>
  17. #include <math.h>
  18.  
  19. const double eps0 = ldexp(1,-53);  // 2^-53
  20.  
  21.  
  22. enum { ZERO = 0, NON_ZERO = 1, NO_IDEA = 2 };
  23.  
  24.  
  25. class Float {
  26.  
  27.   double num;
  28.   double mes;
  29.  
  30. public:
  31.  
  32. Float(Int i) 
  33. { if (i == 0) 
  34.      { num = 0; 
  35.        mes = 0; 
  36.       }
  37.   else 
  38.      { num = Itodouble(i);
  39.        int exp = 1 + lg(i); //Ilog(abs(i) - 1);
  40.        mes = ldexp(1, exp );
  41.       }
  42. }
  43.  
  44. Float(double d, double m) { num = d; mes = m; }
  45.  
  46. Float() { num = 0; mes = 0; }
  47.  
  48.  
  49. operator double() const { return num; }
  50.  
  51.  
  52. friend Float operator+(const Float& a, const Float& b)
  53. { return Float(a.num + b.num, 2*((a.mes > b.mes) ? a.mes : b.mes)); }
  54.  
  55. friend Float operator-(const Float& a, const Float& b)
  56. { return Float(a.num - b.num, 2*((a.mes > b.mes) ? a.mes : b.mes)); }
  57.  
  58. friend Float operator*(const Float& a, const Float& b)
  59. { return Float(a.num * b.num, a.mes * b.mes); }
  60.  
  61.  
  62. friend int Non_Zero(const Float& f, float i)
  63. { double eps =  i * f.mes * eps0;
  64.  
  65.   if (fabs(f.num) > eps)
  66.      return NON_ZERO;
  67.   else
  68.      if (eps < 1)
  69.         return ZERO;
  70.      else
  71.         return NO_IDEA;
  72.  }
  73.  
  74. friend int Sign(const Float& f)        { return (f.num > 0) ? 1 : -1; }
  75. friend double Lmax(const Float& f)     { return f.mes; }
  76. friend double Eps(const Float& f, int i ) { return i * f.mes * eps0; }
  77.  
  78.  
  79. };
  80.  
  81. inline int Sign(const Int& x)        { return sign(x); }
  82. inline double Lmax(const Int& x)     { return 0; }
  83. inline double Eps(const Int& x, int) { return 0; }
  84. inline bool Non_Zero(const Int& x, float=0) 
  85. { return (Sign(x) != 0) ? NON_ZERO : ZERO; }
  86.  
  87.  
  88. inline int Sign(double x)
  89. { if (x==0) return 0;
  90.   return ( x>0 ? 1 : -1);
  91.  }
  92. inline double Lmax(double)   { return 0; }
  93. inline double Eps(double)    { return 0; }
  94. inline bool Non_Zero(double x, float=0) { return (x != 0) ? NON_ZERO : ZERO; }
  95.